package main;
import java.util.Hashtable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.Serializable;
import java.util.Set;
import java.util.Map.Entry;
import java.util.Vector;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import model.Account;
import model.Person;
/**
* @author Lorand
*
*/
public class Bank implements BankProc, java.io.Serializable {
public Hashtable<String, ArrayList<Account>> bank;
public Bank(){
bank= new Hashtable<String, ArrayList<Account>>();
}
@Override
public void readAccounts() {
assert bank !=null;
try{
FileInputStream out= new FileInputStream("src/bank.ser");
ObjectInputStream in= new ObjectInputStream(out);
bank= (Hashtable<String, ArrayList<Account>>) in.readObject();
in.close();
out.close();
}catch( IOException | ClassNotFoundException e){
e.printStackTrace();
}
}
@Override
public void writeAccounts() {
assert bank != null;
boolean ok=false;
try{
FileOutputStream out= new FileOutputStream("src/bank.ser");
ObjectOutputStream in= new ObjectOutputStream(out);
in.writeObject(bank);
in.close();
out.close();
ok=true;
}catch( IOException e){
e.printStackTrace();
}
assert ok;
}
@Override
public void addAccount(Account acc) {
assert acc.correctParam();
String CNP = acc.getPerson().getCNP();
int size = bank.size();
int size1=0;
if(bank.containsKey(CNP)== true){
size1= bank.get(CNP).size();
bank.get(CNP).add(acc);
}
else{
ArrayList<Account> list = new ArrayList<Account>();
size1= list.size();
list.add(acc);
bank.put(CNP, list);
}
}
@Override
public void deleteAccount(Account acc) {
assert acc.correctParam();
String CNP = acc.getPerson().getCNP();
int size=0;
int size1=0;
if(bank.containsKey(CNP)==true){
if(bank.get(CNP).size()!=0){
size1= bank.get(CNP).size();
bank.get(CNP).remove(acc);
}
else
{
size= bank.size();
bank.remove(CNP);
}
}
assert bank.size()== size-1 || bank.get(CNP).size()== size1-1;
}
public Account getAccount(int acc){
assert acc>0;
Account a=null;
Set<Map.Entry<String, ArrayList<Account>>> entrySet= bank.entrySet();
Iterator<Map.Entry<String,ArrayList<Account>>> i= entrySet.iterator();
while(i.hasNext()){
Map.Entry<String, ArrayList<Account>> w= i.next();
ArrayList<Account> list = (ArrayList<Account>) w.getValue();
for (int j = 0;j<list.size();j++)
{
if (list.get(j).getAccountId() == acc)
a = list.get(j);
}
}
if (a == null)
return null;
assert a.correctParam();
return a;
}
public double depositMoneyIntoAccount( int Id, double m){
double b=-1;
Account a= getAccount(Id);
if (a == null)
return -1;
String cnp = a.getPerson().getCNP();
if (bank.containsKey(cnp))
{
ArrayList<Account> list = bank.get(cnp);
for (int i = 0 ;i<list.size();i++)
{
if (list.get(i).getAccountId() == a.getAccountId())
b= list.get(i).depositMoney(m);
}
}
return b;
}
@Override
public double extractMoneyIntoAccount(int accountId, double money) {
double extr=-1;
Account a= getAccount(accountId);
String CNP= a.getPerson().getCNP();
if(bank.containsKey(CNP)==true){
ArrayList<Account> c= bank.get(CNP);
for(int i=0;i<c.size();i++)
if(c.get(i).getAccountId()==a.getAccountId()){
extr= c.get(i).extractMoney(money);
}
}
return extr;
}
public String toString(){
String rez ="";
Set<Map.Entry<String, ArrayList<Account>>> entrySet= bank.entrySet();
Iterator<Map.Entry<String,ArrayList<Account>>> i= entrySet.iterator();
while(i.hasNext()){
Map.Entry<String, ArrayList<Account>> w= i.next();
ArrayList<Account> ac = (ArrayList<Account>) w.getValue();
rez += ac.get(0).getPerson().getFristName() + " " + ac.get(0).getPerson().getLastName() + "\n" ;
for (int j = 0;j < ac.size();j++)
rez += " "+ac.get(j).getAccountId() + " "+ ac.get(j).getAcountName()+ " "+ ac.get(j).getMoneyAmount() +"\n";
}
return rez;
}
public int nextIdAccount() {
int rez = 0;
Set<Entry<String, ArrayList<Account>>> entrySet = bank.entrySet();
for (Entry entry : entrySet)
{
ArrayList<Account> li = (ArrayList<Account>) entry.getValue();
for (int i = 0;i<li.size();i++)
{
if (rez < li.get(i).getAccountId())
rez = li.get(i).getAccountId();
}
}
return rez;
}
public Vector<Vector<Object>> searchAccountA(String id, String mesaj) {
if (mesaj=="ID"){
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
Vector<Object> row = new Vector<Object>();
Account ac = getAccount(Integer.parseInt(id));
if (ac == null)
return null;
Person p = ac.getPerson();
row.add(p.getLastName());
row.add(p.getFristName());
row.add(p.getCNP());
row.add(ac.getAccountId());
row.add(ac.getMoneyAmount());
row.add(ac.getAcountName());
data.add(row);
return data;
}
else if (mesaj=="CNP")
{
Vector<Vector<Object>> data = new Vector<Vector<Object>>();
Vector<Object> row = new Vector<Object>();
ArrayList<Account> list = bank.get(id);
if (list == null)
return null;
Person p = list.get(0).getPerson();
int i=0;
row.add(p.getLastName());
row.add(p.getFristName());
row.add(p.getCNP());
row.add(list.get(i).getAccountId());
System.out.println(list.get(i).getAccountId());
row.add(list.get(i).getMoneyAmount());
row.add(list.get(i).getAcountName());
System.out.println(list.get(i).getAcountName());
data.add(row);
return data;
}
return null;
}
public boolean isWellFormed()
{
if (bank==null)
{
return false;
}
for (Entry<String, ArrayList<Account>> entry : bank.entrySet())
{
if(entry.getKey()!=null)
{
return false;
}
for(Account account : entry.getValue())
{
if(account.getPerson().correctParam())
{
return false;
}
}
}
return true;
}
}